/**
 * 联系人控制器
 * 处理联系人相关的业务逻辑
 */
const asyncHandler = require('express-async-handler');
const User = require('../models/user');
const Conversation = require('../models/conversation');

/**
 * 获取用户的所有联系人
 * @route GET /api/contacts
 * @access Private
 */
const getContacts = asyncHandler(async (req, res) => {
  // 查找并填充用户的联系人列表
  const user = await User.findById(req.user._id)
    .populate('contacts', 'username email avatar bio isOnline lastSeen');

  res.json(user.contacts);
});

/**
 * 添加联系人
 * @route POST /api/contacts/add
 * @access Private
 */
const addContact = asyncHandler(async (req, res) => {
  const { userId } = req.body;

  // 验证输入
  if (!userId) {
    res.status(400);
    throw new Error('请提供用户ID');
  }

  // 验证用户存在
  const contactUser = await User.findById(userId);
  if (!contactUser) {
    res.status(404);
    throw new Error('用户不存在');
  }

  // 检查是否为自己
  if (userId === req.user._id.toString()) {
    res.status(400);
    throw new Error('不能添加自己为联系人');
  }

  // 检查是否已经是联系人
  const user = await User.findById(req.user._id);
  if (user.contacts.some(contact => contact.toString() === userId)) {
    res.status(400);
    throw new Error('该用户已经是您的联系人');
  }

  try {
    // 添加联系人（双向）
    user.contacts.push(userId);
    await user.save();

    contactUser.contacts.push(req.user._id);
    await contactUser.save();

    // 创建或获取对话
    let conversation = await Conversation.findOne({
      participants: { $all: [req.user._id, userId], $size: 2 }
    });

    if (!conversation) {
      conversation = await Conversation.create({
        participants: [req.user._id, userId]
      });
    }

    // 返回添加的联系人信息
    const addedContact = await User.findById(userId)
      .select('username email avatar bio isOnline lastSeen');

    res.status(201).json({
      contact: addedContact,
      conversation: {
        _id: conversation._id
      }
    });
  } catch (error) {
    // 处理MongoDB错误
    if (error.code === 11000 || error.message.includes('E11000')) {
      res.status(400);
      throw new Error('该用户已经是您的联系人');
    }
    
    // 重新抛出其他错误
    throw error;
  }
});

/**
 * 移除联系人
 * @route DELETE /api/contacts/:contactId
 * @access Private
 */
const removeContact = asyncHandler(async (req, res) => {
  const contactId = req.params.contactId;

  // 验证用户存在
  const contactUser = await User.findById(contactId);
  if (!contactUser) {
    res.status(404);
    throw new Error('用户不存在');
  }

  // 移除联系人（双向）
  await User.findByIdAndUpdate(req.user._id, {
    $pull: { contacts: contactId }
  });

  await User.findByIdAndUpdate(contactId, {
    $pull: { contacts: req.user._id }
  });

  // 不删除对话，只返回成功消息
  res.json({ message: '联系人已移除' });
});

/**
 * 搜索联系人
 * @route GET /api/contacts/search
 * @access Private
 */
const searchContacts = asyncHandler(async (req, res) => {
  const { keyword } = req.query;

  // 验证关键词
  if (!keyword) {
    res.status(400);
    throw new Error('请提供搜索关键词');
  }

  // 获取当前用户的联系人ID列表
  const user = await User.findById(req.user._id);
  
  // 搜索用户
  const users = await User.find({
    $and: [
      // 搜索条件：用户名或邮箱包含关键词
      {
        $or: [
          { username: { $regex: keyword, $options: 'i' } },
          { email: { $regex: keyword, $options: 'i' } }
        ]
      },
      // 排除自己
      { _id: { $ne: req.user._id } },
      // 排除已经是联系人的用户
      { _id: { $nin: user.contacts } }
    ]
  }).select('username email avatar bio isOnline lastSeen');

  res.json(users);
});

/**
 * 获取或创建与联系人的对话
 * @route POST /api/contacts/conversation
 * @access Private
 */
const getOrCreateConversation = asyncHandler(async (req, res) => {
  const { contactId } = req.body;
  
  // 验证输入
  if (!contactId) {
    res.status(400);
    throw new Error('请提供联系人ID');
  }
  
  // 验证用户存在
  const contactUser = await User.findById(contactId);
  if (!contactUser) {
    res.status(404);
    throw new Error('联系人不存在');
  }
  
  // 验证是否为联系人
  const user = await User.findById(req.user._id);
  if (!user.contacts.includes(contactId)) {
    res.status(403);
    throw new Error('该用户不是您的联系人');
  }
  
  // 查找现有对话
  let conversation = await Conversation.findOne({
    participants: { $all: [req.user._id, contactId], $size: 2 }
  });
  
  // 如果不存在，创建新对话
  if (!conversation) {
    conversation = await Conversation.create({
      participants: [req.user._id, contactId]
    });
  }
  
  res.json({
    _id: conversation._id,
    participants: conversation.participants
  });
});

module.exports = {
  getContacts,
  addContact,
  removeContact,
  searchContacts,
  getOrCreateConversation
}; 